/*
 * CompresorAritmetico.h
 *
 *  Created on: 26/06/2012
 *      Author: natuchis
 */

#ifndef COMPRESORARITMETICO_H_
#define COMPRESORARITMETICO_H_


#include <iostream>
#include <list>
#include <math.h>
#include <fstream>

#include "../Modelos/Caracter.h"
#include "../Modelos/Datos.h"
#include "Util.h"

using namespace std;

class CompresorAritmetico{

private:

	FILE *archivo;
	double pisoactual;
	double techoactual;
	short UF;
	char* bufferEscritura;
	short bitsEnBuffer;

	char* bufferLectura;
	int cantidadBits;
	int posicionArchivo;

	string nombreArchivo;


public:
	CompresorAritmetico(const char* nombreArchivo, char indicador);
	~CompresorAritmetico();

	/** Pre: Este metodo solo se debe utilizar al comenzar la compresion
	 *  Post: Escribe en el archivo a comprimir el orden de compresion maximo utilizado
	 */
	void setOrdenCompresionMaximo(unsigned short int ordenMaximo);

	/** Pre: Este metodo solo se debe utilizar al comenzar la descompresion
	 *  Post: Devuelve el orden de compresion maximo utilizado durante la compresion
	 */
	unsigned short int getOrdenCompresionMaximo();

	void comprimirCaracter (Datos &datos);
	string descomprimirCaracter	(Datos &datos);

	string getRuta();

protected:
	char* decABin(int numero, short int cantidadBits);
	int binADec(char* binario, short int tamanioCadena);
//	bool buscarCaracter(unsigned char caracter, list<unsigned char> lista);
	char* normalizar(char* pisob, char* techob);
	void emitir(char* auxiliar);
	char* obtenerCadena(int numero);
	bool compararCadenas(char* primerCadena, char* segundaCadena, int longitud);
	void emitirEOF(char* aEmitir, int UFanterior);

};

#endif /* COMPRESORARITMETICO_H_ */
